<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <!-- iife 全称：    Immediately-Invoked Function Expression  -->
    <!-- 立即执行函数 表达式（匿名函数自调用） -->
    <!-- 2.作用 
        * 隐藏实现
        * 不会污染外部（全局）命名空间

    -->

    <script type="text/javascript">
        var b = 1;
        console.log(b + '----');
        // 就是一个匿名函数，然后去调用它，它会立即执行，并且只能执行一次。
        (function() { // 匿名函数自调用   
            // 隐藏内部实现，不污染外部命名空间
            var a = 3; // 如果写在外面会产生一个全局变量a
            console.log(a + 3); // 6
        })()
        var a = 4
        console.log(a); // 4


        (function() {
            var a = 1;

            function test() {
                console.log(++a);
            }
            // 下面这个其实是一个函数表达式 （将一个function声明的函数赋给一个变量）
            window.$ = function() { // 向外暴露一个全局函数
                return { // $() 执行后，返回的是一个对象
                    test: test // 属性名test: 属性值 test(对上面那个test函数的引用，也就是函数test表达式)
                }
            }
        })()
        // 1. $是一个函数； 2. $ 执行后返回的是一个对象 ,此处的test是对象的属性，本质上是一个函数。因此调用（test后加（）），相当于调用了上面的test函数
        $().test() // 输出2
    </script>
</body>

</html>